package ww;

public class J17_OOP3 {

	// this 연산자, this생성자
	// 멤버변수에 사용하는 this는 현재 클래스 자신을 의미
	// 생성자에 사용하는 this 는 코드 간결성을 위해 사용
	
	public static void main(String[] args) {
		// 생성자를 이용해 객체를 만들고
		// 멤버변수에 값을 직접 초기화
		// 생성자
		Member user01 = new Member();
		user01.userid = "zzyzzy";
		user01.passwd = "12345";
		
		
		// 멤버 변수 초기화
		Member user02 = new Member();
		user02.showinfo();
		Member user03 = new Member();
		user03.showinfo();
		
		// 인자 있는 생성자로 객체 생성
		Member user04 = new Member("dkdlel", "qlqjs");
		user04.showinfo();
		
		Car mycar01 = new Car();
	} // main
	
	

} // class
class Member{
	String userid;
	String passwd;
	
	// 회원 정보 출력 showinfo
	void showinfo(){
		System.out.println(userid);
		System.out.println(passwd);
		userid = "1233";
		passwd = "321";
	}
		// 기본 생성자 - 인자 없음
		public Member(){
		}
		
		// 사용자 정의 생성자 - 인자 있음
		public Member(String myuserid, String mypasswd){
			userid = myuserid;
			passwd = mypasswd;
		}
			
		
	} // 첫번쨰 클레스문
class Car{
	String brand;
	String color;
	public Car(){}
	
	// 인자 있는 생성자를 사용하는 경우
	// 기본생성자도 직접 만들어 둬야 함
	
	public Car(String mybrand, String mycolor){
		brand = mybrand;
		color = mycolor;
		
	} // 생성자
} // 두번쨰 클레스 문

class DVD { 
	int dvdno;
	String dvdtitle;
	String genre;
	public DVD(){}
	public DVD(int dvdno, String dvdtitle, String genre){
		// 생성자의 인자명과 멤버변수명은 일치
		// 왜냐하면, 생성자의 인자명을 새로 짓는것은 귀찮음..
		
		// 그런데 , 생성자의 인자명과 멤버변수명이
		// 서로 같은 경우 멤버변수가리기 shadowing 현상이 발생
		// 따라서, 클래스의 멤버변수는 this 연산자를 이용하는 것
		
		// 생성자의 인자명과 멤버변수명이 서로 같은 경우
	this.dvdno = dvdno;
	this.dvdtitle = dvdtitle;
	this.genre = genre;
	}// 생성자 닫기
} // 클래스 닫기
class book {
	int bookno;
	String booktilte;
	String genre;
	
	public book(){}
	public book(int bookno){
		this.bookno = bookno;
	}
		
	public book(String booktitle){
		this.booktilte = booktitle;
	}
	public book(int bookno, String booktitle){
		//this.bookno = bookno;		// 첫번째 줄 코드를 간단히 쓰기
		//this.bookno = bookno;		// 두번째 줄 코드를 간단히 쓰기
		this(bookno);   			// 첫번쨰 줄 코드를 this()로 대체
		//this(booktitle);   		// 두번쨰 줄 코드를 this()로 대체
		// 단, this()는 언제나 코드의 맨 처음의 나와야 함
	}
	
} // 클래스 닫기

